#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10, M = N * 2;
int h[N], e[M], ne[M], idx;
int w[N], sz[N];
int n, m;
LL ans;
void add(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

//void dfs(int u, int fa, int cnt)
//{
//	sz[u] = 1;
//	if (w[u])cnt++;
//	else cnt = 0;
//	if (cnt > m)return;
//	for (int i = h[u]; ~i; i = ne[i]) {
//		int j = e[i];
//		if (j == fa)continue;
//		if (cnt + w[j] > m)continue;
//		dfs(j, u, cnt);
//		sz[u] += sz[j];
//	}
//	if (sz[u] == 1 && u != 1) {
//		//cout << "u===" << u << endl;
//		if (cnt <= m) {
//			ans++;
//		}
//	}
//}
void dfs(int u, int fa, int cnt)
{
	if (sz[u] == 1 && u != 1) {
		if (cnt <= m)ans++;
		return;
	}
	for (int i = h[u]; ~i; i = ne[i]) {
		int j = e[i];
		if (j == fa)continue;
		if (!w[j])dfs(j, u, 0);
		else if (cnt < m)dfs(j, u, cnt + 1);
	}
}
int main()
{
	cin >> n >> m;
	memset(h, -1, sizeof(h));
	for (int i = 1; i <= n; i++)cin >> w[i];
	for (int i = 0; i < n - 1; i++) {
		int u, v;
		cin >> u >> v;
		add(u, v);
		add(v, u);
		sz[u]++;
		sz[v]++;
	}
	dfs(1, 0, w[1]);
	cout << ans << endl;
	return 0;
}